/*
 请求封装
 */
import axios from "axios";
import router from '../router/index'
import {ElMessage,ElMessageBox} from "element-plus";


export function request(config) {
    const instance = axios.create({
        baseURL:'http://localhost:8001',
        timeout: 10000
    })
    instance.defaults.withCredentials = true;
    
    /*前置导航守卫（请求处理）*/
    instance.interceptors.request.use(config=>{
        //拥有token令牌，即在请求头中上传token令牌
        if(localStorage.getItem('tokenStr')){
            config.headers['Authorization'] = localStorage.getItem('tokenStr');
        }
        //config为请求配置
        return config;
    },err=>{})
    
    // 重新请求函数
    function tautology(err) {
        return new Promise(function (resolve) {
            console.log('接口' + err.config.url + '请求失败，重新请求');
            resolve();
        }).then(function () {
            return instance(err.config);
        })
    }
    
    /*后置导航守卫（响应处理）*/
    instance.interceptors.response.use(res=>{
        // console.log('res',res)
        // console.log('res.headers',res.headers)
        if(res.status === 200){//请求成功
            let code = null;
            if(res.data instanceof ArrayBuffer) {//处理请求文件流
                try {
                    let enc = new TextDecoder('utf-8')
                    let myres = JSON.parse(enc.decode(new Uint8Array(res.data))) //转化成json对象
                    code = myres.code;
                    console.log('myres',myres)
                    console.log('返回的数据是非二进制数据，下载文件失败');
                } catch (err) {
                    // console.log('下载文件成功!');
                }
            }else{
                code = res.data.code
            }
            // console.log('code', code);
            switch (code){
                case 500:
                    // ElMessage.error('服务器请求错误！');
                    break;
                case 1001:
                    ElMessage.error('用户未登录，请先登录！');
                    router.push('/login');
                    break;
                case 1002:
                    ElMessage.error('你的用户权限不足！')
                    return;
                case 1003:
                    ElMessage.error('用户登录已过期，请先登录！')
                    router.push('/login')
                    break;
                case 2001:
                    ElMessage.error('该菜单已被禁用！')
                    // throw new Error('菜单禁用了');
                    return;
            }
        }
        return res.data;
    },err=>{
        // console.log('err',err);
        // console.log('err.config',err.config);
        //1、网络错误、连接服务错误处理
        if(err.message === 'Network Error'){
            let path = sessionStorage.getItem(`Network Error`)
            if(!path){
                sessionStorage.setItem('Network Error',true);
                ElMessageBox
                    .confirm(
                        '网络错误，请检查服务端，请【点击重试】！',
                        '提示',
                        {
                            confirmButtonText: '重试',
                            cancelButtonText: '取消',
                            type: 'warning'
                        }
                    )
                    .then(() => {
                            sessionStorage.removeItem('Network Error')
                            return tautology(err);
                    })
            }
            return;
        }
        
        //2、请求超时错误处理
        if (err.message === 'timeout of 10000ms exceeded') {
            let conf = err.config;
            switch (conf.url){
                case '/user-info'://系统自动重载的资源
                case '/user-menu':
                case '/sys/font-dict-cache':
                    return tautology(err);
                default:
                    // ElMessageBox.confirm(
                    //     '网络连接超时，请【点击重试】！',
                    //     '提示',
                    //     {
                    //         confirmButtonText: '点击重试',
                    //         type: 'warning', showClose: true, showCancelButton: false, closeOnClickModal: false}
                    // ).then(() => {
                    //     tautology(err);
                    // })
            }
        }
    })
    return instance(config);
}

// export function requestArrayBuffer(config){
//     const instanceArrayBuffer = axios.create({
//         baseURL:'http://localhost:8001',
//         timeout: 10000
//     })
//     instanceArrayBuffer.defaults.withCredentials = true;
//
//     /*前置导航守卫（请求处理）*/
//     instanceArrayBuffer.interceptors.request.use(config=>{
//         return config;
//     },err=>{})
//
//     /*后置导航守卫（响应处理）*/
//     instanceArrayBuffer.interceptors.response.use(res=>{
//         // console.log('res',res)
//         // console.log('res.headers',res.headers)
//         if(res.status === 200){//请求成功
//             let code = res.data.code;
//             let msg = res.data.msg;
//             switch (code){
//                 case 500:
//                     // ElMessage.error('服务器请求错误！');
//                     break;
//                 case 1001:
//                     ElMessage.error('用户未登录，请先登录！');
//                     router.push('/login');
//                     break;
//                 case 1002:
//                     ElMessage.error('你的用户权限不足！')
//                     return;
//                 case 1003:
//                     ElMessage.error('用户登录已过期，请先登录！')
//                     router.push('/login')
//                     break;
//                 case 2001:
//                     ElMessage.error('该菜单已被禁用！')
//                     // throw new Error('菜单禁用了');
//                     return;
//             }
//         }
//         return res.data;
//     },err=>{
//         // console.log('err',err);
//         // console.log('err.config',err.config);
//         //1、网络错误、连接服务错误处理
//         if(err.message === 'Network Error'){
//             let path = sessionStorage.getItem(`Network Error`)
//             if(!path){
//                 sessionStorage.setItem('Network Error',true);
//                 ElMessageBox
//                     .confirm(
//                         '网络错误，请检查服务端，请【点击重试】！',
//                         '提示',
//                         {
//                             confirmButtonText: '重试',
//                             cancelButtonText: '取消',
//                             type: 'warning'
//                         }
//                     )
//                     .then(() => {
//                         sessionStorage.removeItem('Network Error')
//                         return tautology(err);
//                     })
//             }
//             return;
//         }
//
//         //2、请求超时错误处理
//         if (err.message === 'timeout of 10000ms exceeded') {
//             let conf = err.config;
//             switch (conf.url){
//                 case '/user-info'://系统自动重载的资源
//                 case '/user-menu':
//                 case '/sys/font-dict-cache':
//                     return tautology(err);
//                 default:
//                 // ElMessageBox.confirm(
//                 //     '网络连接超时，请【点击重试】！',
//                 //     '提示',
//                 //     {
//                 //         confirmButtonText: '点击重试',
//                 //         type: 'warning', showClose: true, showCancelButton: false, closeOnClickModal: false}
//                 // ).then(() => {
//                 //     tautology(err);
//                 // })
//             }
//         }
//     })
//     return instance(config);
// }

